/*
 * IndiceDimensiones.cpp
 *
 *  Created on: May 20, 2012
 *      Author: lucasj
 */

#include "IndiceDimensiones.h"

DimensionIndex::IndiceDimensiones::IndiceDimensiones(Validador& validator):validator(validator) {

}

DimensionIndex::IndiceDimensiones::~IndiceDimensiones() {

}

// Funcionamiento obtenerSiguientePosicion:
// Mi Función de parseo que con dos posiciones obtiene
// una sub cadena de un string.

void DimensionIndex::IndiceDimensiones::obtenerSiguientePosicion(unsigned int
					    &posAnterior, unsigned int &posActual, std::string &linea) {
  posAnterior = posActual;
  posActual = (linea.find("|", posAnterior + 1));
}

// Funcionamiento Cargar:
// Cargar es la función que carga el índice
// como no tenía un validador de hechos y dimensiones
// directamente cargo los 5 primeros valores del
// del ejemplo

void DimensionIndex::IndiceDimensiones::Cargar(std::string& linea, int cod) {

	int posTabla = 0;
	unsigned int posActual = linea.find("|");
	unsigned int posAnterior = 0;
	std::string dimension = linea.substr(posAnterior, posActual);
	while (posActual > posAnterior) {
		if (this->validator.getTipo(posTabla, 1) == 'D') {
			this->map.insert(std::pair<std::string, int>(dimension, cod));
		}
		obtenerSiguientePosicion(posAnterior, posActual, linea);
		dimension = linea.substr(posAnterior + 1, posActual - posAnterior - 1);
		++posTabla;
	}
}

std::ostringstream& DimensionIndex::operator<<(std::ostringstream& oss, IndiceDimensiones &indice) {
	iteradorDimension it;
	for (it = indice.map.begin(); it != indice.map.end(); ++it) {
		// oss << it->first << " ";
		oss << it->second << std::endl;
	}
	return oss;
}

// Funcionamiento VerificarSiEsFecha:
// Verifica si una dimension es una fecha convirtiendolo
// a un entero. Si lo logra es una dimensión, sinó
// no lo convierte.

bool VerificarSiEsFecha(const std::string &dimension) {
	std::stringstream convert(dimension);
	int res = 890;
	convert >> res;
	if (res == 0)
		return false;
	else return true;
}

// Funcionamiento Buscar:
// Buscar en el índice los requerimientos de la consulta.
// Estos se pasan por el string valor, que se compara
// con los elementos del índice. Si un elemento es una fecha
// se compara si el valor de la consulta está contenido
// en la fecha (con el find), sino se compara con el ==.
// Si encuentra los valores se lo agrega al índice de resultados.

void DimensionIndex::IndiceDimensiones::Buscar(std::string &valor, ResultIndex::IndiceResultado &result) {
	iteradorDimension it = this->map.begin();
	bool salir = false;
	bool encontrado = false;
	while ((it != this->map.end()) && (salir == false)) {
		if (VerificarSiEsFecha(it->first)) {
			if (it->first.find(valor) != std::string::npos) {
				result.SetElem(it->second, it->first);
				encontrado = true;
			}
		} else if (it->first == valor) {
			result.SetElem(it->second, it->first);
			encontrado = true;
		}else if (encontrado == true)
			salir = true;
		++it;
	}
}


